#!/bin/bash

# 设置颜色输出
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # 无颜色

# 输出带颜色的信息
info() {
  echo -e "${GREEN}[信息]${NC} $1"
}

warn() {
  echo -e "${YELLOW}[警告]${NC} $1"
}

error() {
  echo -e "${RED}[错误]${NC} $1"
}

# 检查并释放指定端口
check_and_free_port() {
  local port=$1
  info "检查端口 $port 是否被占用..."
  
  # 使用lsof查找占用端口的进程（适用于macOS和Linux）
  if command -v lsof &> /dev/null; then
    local pid=$(lsof -t -i:$port)
    if [ -n "$pid" ]; then
      warn "端口 $port 被进程 $pid 占用，尝试终止..."
      kill -15 $pid 2>/dev/null || kill -9 $pid 2>/dev/null
      sleep 1
      pid=$(lsof -t -i:$port)
      if [ -n "$pid" ]; then
        error "无法释放端口 $port，仍被进程 $pid 占用"
        echo -n "是否强制终止此进程? (y/n): "
        read answer
        if [[ "$answer" == "y" || "$answer" == "Y" ]]; then
          kill -9 $pid 2>/dev/null
          sleep 1
          info "已强制终止进程 $pid"
        else
          error "端口 $port 仍被占用，可能导致启动失败"
        fi
      else
        info "端口 $port 已成功释放"
      fi
    else
      info "端口 $port 未被占用"
    fi
  
  # 使用netstat作为备选（适用于某些Linux系统）
  elif command -v netstat &> /dev/null; then
    local pid=$(netstat -tulpn 2>/dev/null | grep ":$port " | awk '{print $7}' | cut -d'/' -f1 | head -n1)
    if [ -n "$pid" ]; then
      warn "端口 $port 被进程 $pid 占用，尝试终止..."
      kill -15 $pid 2>/dev/null || kill -9 $pid 2>/dev/null
      sleep 1
      pid=$(netstat -tulpn 2>/dev/null | grep ":$port " | awk '{print $7}' | cut -d'/' -f1 | head -n1)
      if [ -n "$pid" ]; then
        error "无法释放端口 $port，仍被进程 $pid 占用"
        echo -n "是否强制终止此进程? (y/n): "
        read answer
        if [[ "$answer" == "y" || "$answer" == "Y" ]]; then
          kill -9 $pid 2>/dev/null
          sleep 1
          info "已强制终止进程 $pid"
        else
          error "端口 $port 仍被占用，可能导致启动失败"
        fi
      else
        info "端口 $port 已成功释放"
      fi
    else
      info "端口 $port 未被占用"
    fi
  
  # 如果以上命令都不可用
  else
    warn "无法检查端口占用状态 (需要 lsof 或 netstat 命令)"
  fi
}

# 检查Node.js是否安装
if ! command -v node &> /dev/null; then
  error "未找到Node.js，请先安装Node.js"
  exit 1
fi

# 检查npm是否安装
if ! command -v npm &> /dev/null; then
  error "未找到npm，请先安装npm"
  exit 1
fi

# 确保安装了所有依赖
install_dependencies() {
  info "检查后端依赖..."
  if [ ! -d "node_modules" ]; then
    warn "后端依赖未安装，正在安装..."
    npm install
    if [ $? -ne 0 ]; then
      error "后端依赖安装失败"
      exit 1
    fi
    info "后端依赖安装完成"
  else
    info "后端依赖已安装"
  fi

  info "检查前端依赖..."
  if [ ! -d "frontend/node_modules" ]; then
    warn "前端依赖未安装，正在安装..."
    cd frontend && npm install
    if [ $? -ne 0 ]; then
      error "前端依赖安装失败"
      exit 1
    fi
    cd ..
    info "前端依赖安装完成"
  else
    info "前端依赖已安装"
  fi
}

# 检查并释放需要的端口
check_and_free_port 3005  # 后端端口
check_and_free_port 5173  # 前端端口

# 启动后端服务
start_backend() {
  info "启动后端服务..."
  # 使用后台执行并保存PID
  npm run dev &
  BACKEND_PID=$!
  info "后端服务已启动，PID: $BACKEND_PID"
}

# 启动前端服务
start_frontend() {
  info "启动前端服务..."
  cd frontend && npm run dev &
  FRONTEND_PID=$!
  info "前端服务已启动，PID: $FRONTEND_PID"
  cd ..
}

# 清理函数，用于Ctrl+C中断时
cleanup() {
  info "正在关闭服务..."
  if [ -n "$BACKEND_PID" ]; then
    kill $BACKEND_PID 2>/dev/null
    info "后端服务已关闭"
  fi
  if [ -n "$FRONTEND_PID" ]; then
    kill $FRONTEND_PID 2>/dev/null
    info "前端服务已关闭"
  fi
  exit 0
}

# 设置清理函数在接收到SIGINT (Ctrl+C)时执行
trap cleanup SIGINT

# 主执行流程
info "腾讯云对象存储资源浏览器启动脚本"
install_dependencies
start_backend
start_frontend

info "所有服务已启动"
info "前端地址: http://localhost:5173"
info "后端地址: http://localhost:3005"
info "按 Ctrl+C 停止所有服务"

# 保持脚本运行
wait 